#include "myStdio.h"

// OS 层面的缓冲区刷新策略复杂的多：（无法证明，可以看到现象）
// 所以下面的 OS 层面的
void testMyStdio()
{
    // c 接口
    printf("hello printf");
    fprintf(stdout, "hello fprintf\n");
    const char *fputsString = "hello puts\n";
    fputs(fputsString, stdout);

    // 系统接口
    const char *wstring = "hello write\n";
    write(1, wstring, strlen(wstring));

    // 代码结束之前，进行创建子进程
    // 1. 如果我们没有进行>,看到了4条消息
    //    stdout 默认使用的是行刷新，在进程fork之前，三条C函数已经将数据进行打印输出到显示器上(外设),你的FILE内部，进程内部不存在对应的数据啦
    // 2. 如果我们进行了>, 写入文件不再是显示器，而是普通文件，采用的刷新策略是全缓冲，之前的3条c显示函数，虽然带了\n,但是不足以stdout缓冲区写满！数据并没有被刷新！！！
    // 执行fork的时候，stdout属于父进程，创建子进程时， 紧接着就是进程退出！谁先退出，一定要进行缓冲区刷新(就是修改)
    // 写时拷贝！！数据最终会显示两份
    // 3. write为什么没有呢？上面的过程都和wirte无关，wirte没有FILE，而用的是fd，就没有C提供的缓冲区
    fork(); // fork
}

int main(void)
{
    // testMyStdio();

    /////////////////////////////////////////////////////////////////////////
    // c cpp 语言层面的缓冲区刷新策略：无缓冲，行缓冲，全缓冲
    // FILE_ *fp = fopen_("./log.txt", "w");
    // if (fp == NULL)
    //     return 1;

    ////////////////////////////////////////////////////////////////////////////
    // // const char *msg = "hello wrold hello vscode\n";
    // const char *msg = "hello wrold\n";
    // fwrite_(msg, strlen(msg), fp);
    // fclose_(fp);

    ////////////////////////////////////////////////////////////////////////////
    // 下面的代码码：因为显示器是行缓冲，msg 没有 '\n',所以数据先会读在缓冲区，
    // fclose_(fp) 就会引起缓冲区刷新，就写入到文件 log.txt 里面去了
    // int count = 0;
    // const char *msg = "hello vscode";
    // while (1)
    // {
    //     fwrite_(msg, strlen(msg), fp);
    //     sleep(1);
    //     count++;
    //     printf("%d\n", count);
    //     // 终端用下面的代码看现象：
    //     // while :; do cat log.txt ; sleep 1; echo "#######"; done

    //     if (count == 10)
    //         break;
    // }
    // fclose_(fp); // 会刷新缓冲区的哦

    /////////////////////////////////////////////////////////////////////////
    // int count = 0;
    // const char *msg = "hello vscode";
    // 没有 '\n' 但是下面的 if(count % 3 == 0) fflush_(fp) 会强制刷新的哦
    // (缓冲区里面存储的数据个数是 3 的倍数的时候就强制刷新)
    // while (1)
    // {
    //     fwrite_(msg, strlen(msg), fp);
    //     sleep(1);
    //     count++;
    //     printf("%d\n", count);
    //     // 终端用下面的代码看现象：
    //     // while :; do cat log.txt ; sleep 1; echo "#######"; done
    //     if (count % 3 == 0)
    //         fflush_(fp);
    //     if (count == 10)
    //         break;
    // }
    // fclose_(fp); // 会刷新缓冲区的哦

    //////////////////////////////////////////////////////////////////////////
    // int count = 0;
    // const char *msg = "hello vscode\n"; // 有 \n,和上面的代码现象有些不同的哦
    // while (1)
    // {
    //     fwrite_(msg, strlen(msg), fp);
    //     sleep(1);
    //     count++;
    //     printf("%d\n", count);
    //    // 终端用下面的代码看现象：
    //    // while :; do cat log.txt ; sleep 1; echo "#######"; done

    //     if (count == 10)
    //         break;
    // }
    // fclose_(fp); // 会刷新缓冲区的哦

    return 0;
}

///////////////////////////////////////////////////////////////////////////
// cpp 里面的文件操作
// #include <iostream>
// #include <fstream>
// #include <string>

// using namespace std;

// int main()
// {
//     ifstream in("./log.txt", ios::in |ios::binary);
//     if(in.is_open()) cout << "open success" << endl;

//     string s;
//     while(getline(in, s))
//     {
//         cout << s << endl;
//     }

//     in.close();

//     return 0;
// }
